/*
动物收容所。有家动物收容所只收容狗与猫，且严格遵守“先进先出”的原则。在收养该收容所的动物时，收养人只能收养所有动物中“最老”（由其进入收容所的时间长短而定）的动物，或者可以挑选猫或狗（同时必须收养此类动物中“最老”的）。换言之，收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构，实现各种操作方法，比如enqueue、dequeueAny、dequeueDog和dequeueCat。允许使用Java内置的LinkedList数据结构。

enqueue方法有一个animal参数，animal[0]代表动物编号，animal[1]代表动物种类，其中 0 代表猫，1 代表狗。

dequeue*方法返回一个列表[动物编号, 动物种类]，若没有可以收养的动物，则返回[-1,-1]。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/animal-shelter-lcci
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
const CAT = 0
const DOG = 1

class AnimalElem {
  constructor (id, type) {
    this.id = id
    this.type = type
  }
}

var AnimalShelf = function () {
  this.dogQueue = []
  this.catQueue = []
}

/**
 * @param {number[]} animal
 * @return {void}
 */
AnimalShelf.prototype.enqueue = function (animal) {
  const type = animal[1]
  const elem = new AnimalElem(...animal)
  type === CAT ? this.catQueue.push(elem) : this.dogQueue.push(elem)
}

/**
 * @return {number[]}
 */
AnimalShelf.prototype.dequeueAny = function () {
  if (this.dogQueue.length && this.catQueue.length) {
    const elem = this.dogQueue[0].id < this.catQueue[0].id ? this.dogQueue.shift() : this.catQueue.shift()
    return [elem.id, elem.type]
  } else if (this.dogQueue.length) {
    return this.dequeueDog()
  } else if (this.catQueue.length) {
    return this.dequeueCat()
  } else {
    return [-1, -1]
  }
}

/**
 * @return {number[]}
 */
AnimalShelf.prototype.dequeueDog = function () {
  if (this.dogQueue.length) {
    const elem = this.dogQueue.shift()
    return [elem.id, elem.type]
  } else {
    return [-1, -1]
  }
}

/**
 * @return {number[]}
 */
AnimalShelf.prototype.dequeueCat = function () {
  if (this.catQueue.length) {
    const elem = this.catQueue.shift()
    return [elem.id, elem.type]
  } else {
    return [-1, -1]
  }
}

/**
 * Your AnimalShelf object will be instantiated and called as such:
 * var obj = new AnimalShelf()
 * obj.enqueue(animal)
 * var param_2 = obj.dequeueAny()
 * var param_3 = obj.dequeueDog()
 * var param_4 = obj.dequeueCat()
 */
